package com.atguigu.gmall.sms.config;

import javax.annotation.Resource;
import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSource;

import com.google.common.graph.Network;
import io.seata.rm.datasource.DataSourceProxy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * 做分布式事务时候的数据源配置类，没有这个配置类，seata分布式事务无法生效
 * 因为seata在做回滚的时候连接数据库使用的是是seata自己封装的DataSourceProxy。
 * 所以我们要在数据连接时候，设置主数据源为DataSourceProxy。
 *
 * 流程如下：先拿到德鲁伊的DruidDataSource，然后用它制作DataSourceProxy，
 *          将DataSourceProxy作为主数据源，生成DateSource放入spring容器中
 *
 */
@Configuration
public class DataSourceConfig {


    //没有32-33这两行代码，会报循环依赖的错误
    //自动装配,让37行代码先执行创建出dataSource,然后再由49行进行封装
    //而不是49行先执行拿到dataSource
    @Resource
    DruidDataSource druidDataSource;

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DruidDataSource druidDataSource() {
        return new DruidDataSource();
    }

    /**
     * 需要将 DataSourceProxy 设置为主数据源（@primary注解的方式），否则事务无法回滚
     *
     * @param druidDataSource The DruidDataSource
     * @return The default datasource
     */
    @Primary //该注解表示自动装配时，有多个bean，优先装配被@Primary修饰的bean
    @Bean("dataSource")
    public DataSource dataSource(DruidDataSource druidDataSource) {
        return new DataSourceProxy(druidDataSource);//导包不要导错，应该导seata包下面的这个类
    }



}
